package xpn.platform.modules.workflow.definition.action;

import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;
import xpn.platform.common.persistence.AbstractBaseEntity;
import xpn.platform.modules.workflow.definition.state.State;
import xpn.platform.modules.workflow.other.commentcolumn.CommentColumn;

import javax.persistence.*;

/**
 * 操作：表示一个流程状态下执行者可以执行的操作。操作可能是人机交互操作、自动执行的操作。
 *
 * @author bobatkm Sep 4, 2017
 */
@Entity
@Table(name = "wf_action")
@Getter
@Setter
public class Action extends AbstractBaseEntity {

	private static final long serialVersionUID = -6806880615722863439L;

	@ManyToOne
	@JoinColumn(nullable = false)
	private State state; // 所属状态

	/**
	 * 操作编号，是工作流和业务系统之间的桥梁， 即根据操作类型不同， message 的具体含义在业务系统中有不同的解释，
	 * 例如操作类型为普通操作，操作名称为打印，
	 */
	@Column(length = 200, unique = false, nullable = true)
	@Length(max = 200)
	private String message;

	/**
	 * 执行前执行，是工作流和业务系统之间的桥梁， 即根据操作类型不同， beforeMessage 的具体含义在业务系统中有不同的解释，
	 * 例如操作类型为普通操作，操作名称为打印，
	 */
	@Column(length = 200, unique = false, nullable = true)
	@Length(max = 200)
	private String beforeMessage;

	/**
	 * 执行后执行，是工作流和业务系统之间的桥梁， 即根据操作类型不同， beforeMessage 的具体含义在业务系统中有不同的解释，
	 * 例如操作类型为普通操作，操作名称为打印，
	 */
	@Column(length = 200, unique = false, nullable = true)
	@Length(max = 200)
	private String afterMessage;

	/**
	 * 保留
	 */
	@Column(length = 20, unique = false, nullable = true)
	private String no;

	@Column(nullable = true)
	@Length(min = 2, max = 40)
	private String name; // 名称

	@Column(nullable = false)
	private Float sortNo; // 排序号

	/**
	 * 操作类型
	 */
	@Column(nullable = false)
	private ActionTypeEnum actionType = ActionTypeEnum.COMMON;

	@Column(length = 1000)
	@Length(max = 1000)
	private String authorizationRule; // 授权规则：规定谁可以执行操作

	@JoinColumn(nullable = true)
	@ManyToOne
	private State sendeeState; // 接收者的状态

	private WaitModeEnum waitMode = WaitModeEnum.WAIT_ALL; // 等待模式

	private DelegateModeEnum delegateMode = DelegateModeEnum.NOT_DELEGATE; // 代表模式

	private Boolean keepAsExecutor = false; // 执行后是否保持为执行者

	@Length(max = 60)
	@Column(unique = false, nullable = true)
	private String description; // 说明

	/**
	 * 表示具体的机构级别
	 */
	@Column(nullable = true)
	private Integer ouLevel;

	/**
	 * 表示具体的机构类型，0：本，1：外
	 */
	@Column(nullable = true)
	private Integer ouType;

	/**
	 * 表示具体的角色条件 null 表示不限制角色
	 */
	private String roleCondition;

	/**
	 * 当 specificCondition 为 SPECIFIC_RECEIVER 时，通过该 URL 获取具体的接收人
	 */
	private String specificReceiverUrl;

	/**
	 * 是否能收回
	 */
	@Column(nullable = true)
	private Boolean canTakeBack;

	/**
	 * 发送模式：单发或多发，仅对选人发送有效
	 */
	private SendModeEnum sendMode;

	/**
	 * 意见栏：仅当操作类型为填写意见操作时才生效
	 */
	@ManyToOne
	@JoinColumn(nullable = true)
	private CommentColumn commentColumn;

	/**
	 * 操作的UI类型
	 */
	private UITypeEnum uiType=UITypeEnum.ActionBar;

	private Boolean completeTodo = false; // 是否完成待办

	private Boolean checkComment = false; // 检查意见栏

	private String defaultComment ; // 你默认意见

	/**
	 * 执行的父流程操作
	 */
	@ManyToOne
	@JoinColumn(nullable = true)
	private Action parentProcessAction;//执行的父流程的操作。

	private Boolean completeReceiverOldToDos;//是否结束接收者的原有待办。

	private Boolean thenClose = false; // 是否关闭当前标签。

	private String todoTip ; // 待办提示。

	private Boolean saveForm = false; // 是否保存表单

	private Boolean notCreateTodoLink = false; // 是否创建待办连接

	public Long getProcessId(){
		if(this.getState()==null) return null;
		if(this.getState().getProcess()==null) return null;
		return this.getState().getProcess().getId();
	};
}
